#ifndef SC_DECODER_H
#define SC_DECODER_H

#include "common.h"

#include "trait/frame_source.h"
#include "trait/packet_sink.h"

#include <stdbool.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>

/* 自定义解码器上下文 */
struct sc_decoder {
    // packet sink trait 视频包事件回调    
    struct sc_packet_sink packet_sink; // packet sink trait
    struct sc_frame_source frame_source; // frame source trait

    const char *name; // must be statically allocated (e.g. a string literal)

    /* 
    AVCodecContext 结构表示程序运行的当前 Codec 使用的上下文，
    着重于所有 Codec 共有的属性(并且是在程序运行时才能确定其值)和关联其他结构的字段
    */
    AVCodecContext *ctx;
    // 解码后的视频帧数据，每一个成功解码的帧数据放在此处    
    AVFrame *frame;
};

/*
初始化自定义解码器
@param decoder 自定义解码器上下文指针
@param name The name must be statically allocated (e.g. a string literal)
*/
void
sc_decoder_init(struct sc_decoder *decoder, const char *name);

#endif
